const {
	findUser
} = require('../../lib/utils/account')
const {
	ERROR
} = require('../../common/error')
const {
	userCollection
} = require('../../common/constants')
const PasswordUtils = require('../../lib/utils/password')

/**
 * 新增用户
 * @tutorial https://uniapp.dcloud.net.cn/uniCloud/uni-id-pages.html#add-user
 * @param {Object}  params
 * @param {String}  params.username       用户名
 * @param {String}  params.password       密码
 * @param {String}  params.nickname       昵称
 * @param {Array}   params.authorizedApp  允许登录的AppID列表
 * @param {Array}   params.role           用户角色列表
 * @param {String}  params.mobile         手机号
 * @param {String}  params.email          邮箱
 * @param {Array}   params.tags           用户标签
 * @param {Number}  params.status         用户状态
 * @param {Object}  params.avatar_file	  用户头像
 * @returns
 */
module.exports = async function(params = {}) {

	let httpInfo = this.getHttpInfo()
	if (httpInfo) {
		params = JSON.parse(httpInfo.body);
	}
	const schema = {
		username: 'username',
		password: 'password',
		authorizedApp: {
			required: false,
			type: 'array<string>'
		}, // 指定允许登录的app，传空数组或不传时表示可以不可以在任何端登录
		nickname: {
			required: false,
			type: 'string'
		},
		role: {
			require: false,
			type: 'array<string>'
		},
		mobile: {
			required: false,
			type: 'mobile'
		},
		email: {
			required: false,
			type: 'email'
		},
		tags: {
			required: false,
			type: 'array<string>'
		},
		status: {
			required: false,
			type: 'number'
		}
	}
	// 如果params.avatar_file是空数组，转成空对象
	if (params.avatar_file && Array.isArray(params.avatar_file) && params.avatar_file.length === 0) {
		params.avatar_file = {}
	}
	this.middleware.validate(params, schema)
	const {
		username,
		password,
		authorizedApp,
		nickname,
		role,
		mobile,
		email,
		tags,
		status,
		avatar_file
	} = params

	
	let {
		userMatched
	} = await findUser({
		userQuery: {
			username,
			mobile,
			email
		},
		authorizedApp
	})
	if (userMatched.length) {
		// throw {
		//   errCode: ERROR.ACCOUNT_EXISTS
		// }
		// 不抛异常，返回已注册的用户

		delete userMatched[0].password;
		return {
			errCode: 0,
			errMsg: '',
			user: userMatched[0],
			attention: "The user has already registered. Can not create a new user."
		}
	}
	const passwordUtils = new PasswordUtils({
		clientInfo: this.getUniversalClientInfo(),
		passwordSecret: this.config.passwordSecret
	})
	const {
		passwordHash,
		version
	} = passwordUtils.generatePasswordHash({
		password
	})
	const data = {
		username,
		password: passwordHash,
		password_secret_version: version,
		dcloud_appid: authorizedApp || [],
		nickname,
		role: role || [],
		mobile,
		email,
		tags: tags || [],
		status,
		avatar_file: avatar_file || {}
	}
	if (email) {
		data.email_confirmed = 1
	}
	if (mobile) {
		data.mobile_confirmed = 1
	}

	// 触发 beforeRegister 钩子
	const beforeRegister = this.hooks.beforeRegister
	let userRecord = data
	if (beforeRegister) {
		userRecord = await beforeRegister({
			userRecord,
			clientInfo: this.getUniversalClientInfo()
		})
	}

	// 查询插入的记录，获取_id



	let _id = await userCollection.add(userRecord)
	userRecord._id = _id.id;
	// 删除password
	delete userRecord.password;
	return {
		errCode: 0,
		errMsg: '',
		user: userRecord
	}
}